
import {put,take} from 'redux-saga/effects';
import * as types from './action-types';

function delay(ms) {
    return new Promise((resolve) => {
        setTimeout(resolve, ms);
    });
}

function* workerSaga(){
    // 如果产出的是一个promise，这个saga会等promise完成再执行
    yield delay(1000);
    // 告诉saga中间件，请帮我向仓库派发一个action={type:types.ADD}
    yield put({type:types.ADD}) //{type:'PUT',action:"ADD"}
}
/**
 * watcherSaga 是用来监听向仓库派发的对象，如果有人向仓库派发关心的对象，则会调用对应的wokersaga
 *
 */
function* watcherSaga(){
    // 监听有人向仓库派发的ASYNC_ADD的动作，如果没有等到，这个saga就会卡在这里或者说暂停在这里
    // 如果有人向仓库派发了，会继续向下执行
    // take只会监听一次，如果监听到了，执行后续代码，以后再派发，就不再执行了
    yield take(types.ASYNC_ADD) //{type:'TAKE',actionType:"ASYNC_ADD"}
    yield workerSaga()
    console.log('watcherSaga执行结束' )
}
export default function* rootSaga() {
   yield watcherSaga()
   console.log('rootSaga执行结束' )
}


// - 处理异步和副作用
//     - redux-promise
//     - redux-thunk
//     - redux-saga
// - 如果我的业余有前后的连接 ，有比较 复杂的业务流程的时候推荐使用saga
// - dva其实也是内置了redux-saga

/**
redux-saga分为三种
worker saga 做具体的工作，如调用API，进行异步请求，获取异步封装结果
watcher saga 监听被dispatch的actions,当接受到action或者知道其被触发时，调用worker执行任务
root saga 立即启动saga的唯一入口
 */ 